/* -*-jde-*- */
package app.htmlGenerator;

import app.conexion.ConexionException;
import app.usuario.beans.Correo;
import app.usuario.beans.Direccion;
import app.usuario.beans.Telefono;
import app.alumnoe.AlumnoE;
import app.alumnoe.cv.CV;
import app.alumnoe.cv.beans.ExperienciaProfesional;
import app.alumnoe.cv.beans.Formacion;
import app.alumnoe.cv.beans.Idioma;
import app.alumnoe.cv.beans.Investigacion;
import app.alumnoe.cv.beans.TecnicoProfesional;
import app.alumnoe.cv.beans.TipoContratacion;
import app.conexion.Conexion;
import app.usuario.Correos;
import app.usuario.Direcciones;
import app.usuario.Telefonos;
import app.util.appException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * HTMLCVGenerator Generador de CV para desplegarse como contenido HTML en la
 * página web.
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Diciembre 2011
 * @version 0.1
 */
public class HTMLCVGenerator {

    private LinkedList<Correo> correos;
    private LinkedList<Telefono> telefonos;
    private LinkedList<Direccion> direcciones;
    private AlumnoE alumno;
    private CV cv;

    /**
     * Generador de CV en formato desplegable HTML. Es necesario que los
     * parámetros esten completos
     *
     * @param correos Los correos electrónicos a partir de los cuales se genera
     * el CV
     * @param telefonos Los telefonos a partir de los que se genera el CV
     * @param direcciones La o las direcciones a lartir de las que se general el
     * CV
     * @param alumno El alumno con el que se genera el CV
     * @param cv El CV completo (Con todas las listas llenas)
     */
    public HTMLCVGenerator(AlumnoE alumno) throws appException {

        Correos c = new Correos(alumno.getnIdUsuario());
        this.correos = c.getCorreos();

        Telefonos t = new Telefonos(alumno.getnIdUsuario());
        this.telefonos = t.getTelefonos();

        Direcciones d = new Direcciones(alumno.getnIdUsuario());
        this.direcciones = d.getDirecciones();
        this.alumno = alumno;
        CV cvTmp = new CV(alumno.getnIdCV(), alumno.getnIdUsuario());
        this.cv = cvTmp;
    }

    @Override
    public String toString() {
        return "HTMLCVGenerator{" + "correos=" + correos + ", telefonos=" + telefonos + ", direcciones=" + direcciones + ", alumno=" + alumno + ", cv=" + cv + '}';
    }

    /**
     * Genera un texto html con la información necesaria de un CV, de modo que
     * pueda ser utilizada para crear una vista web
     *
     * @return El texto html
     */
    public String generarCV() {

        String contenido = "<html><head></head><body>";

        contenido += "<title>CV generado</title>";
        contenido += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">";

        String direcciones_str = "";

        for (Direccion dir : direcciones) {
            direcciones_str += dir.getsCalle() + " " + dir.getsNumeroExterior() + " "
                    + dir.getsNumeroInterior() + " Col. " + dir.getsColonia()
                    + " Del." + dir.getsDelegacion() + " . " + dir.getsCiudad()
                    + "<br>";
        }

        String correos_str = "";
        for (Correo correo : correos) {
            correos_str += correo.getsCorreo() + " | ";
        }

        String telefonos_str = "";
        for (Telefono telefono : telefonos) {
            telefonos_str += telefono.getsTelefono() + " | ";
        }

        String idiomas_str = "";
        for (Idioma idioma : cv.getIdiomas()) {
            String nivel = idioma.isComprensionLectura() ? "Nivel de comprensión lectora" : idioma.getsNivel();
            idiomas_str += ""
                    + "<b><i>" + idioma.getsIdioma() + "</i>: </b>" + nivel + "<br>"
                    + "<b>Institución educativa:</b> " + idioma.getsInstitucionEducativa()
                    + "<br>";
        }

        String formacion_str = "";
        for (Formacion formacion : cv.getFormaciones()) {
            String fechaf = formacion.getdFechaFin() != null ? formacion.getdFechaFin().toString() : "-";
            formacion_str += "<b><i>" + formacion.getsTituloRecibido() + "</i></b><br>"
                    + "<b>" + formacion.getsInstitucionEducativa() + "</b><br>"
                    + "De " + formacion.getdFechaInicio() + "a " + fechaf + "<br>"
                    + "Con promedio: " + formacion.getsPromedio() + "<br>"
                    + formacion.getsDescripcion() + "<br><br>";
        }

        String experienciaProfesional_str = "";
        for (ExperienciaProfesional experienciap : cv.getExperiencia()) {
            String fechasalida = experienciap.isbPuestoActual() ? "- Hoy -" : experienciap.getdFechaSalida().toString();
            experienciaProfesional_str += "<b><i>" + experienciap.getsEmpresa() + "</i></b> como empresa en el giro <i>"
                    + experienciap.getsGiro() + "</i><br>"
                    + "De " + experienciap.getdFechaIngreso() + " a " + fechasalida + "<br>"
                    + "Desempeñando el puesto <i>" + experienciap.getsPuesto() + "</i><br>"
                    + "Con las funciones: " + experienciap.getsFunciones() + "<br>"
                    + "<br>";
        }

        String habilidades = "";
        for (TecnicoProfesional tecnicoprofesional : cv.getConocimientosTecProf()) {

            habilidades += "<b> > <i>" + tecnicoprofesional.getsNombreConocimiento() + "</i></b><br>"
                    + "Con un tiempo de <i>"
                    + tecnicoprofesional.getsAniosExperiencia() + "</i><br>"
                    + "Logrando habilidades de <i>" + tecnicoprofesional.getsNivel() + "</i><br>"
                    + "" + tecnicoprofesional.getsComentarios() + "<br>"
                    + "<br>";
        }

        String investigacion_str = "";
        for (Investigacion investigaciones : cv.getArticulos()) {

            investigacion_str += "<b>Referencia: </b><i>" + investigaciones.getsReferenciaArticulo() + "</i><br>";
        }

        /*
         String contratacion_str = "";
         for (TipoContratacion tipoContratacion : cv.getContratacion()) {
        
         contratacion_str += "" + tipoContratacion.getsTipocontratacion() + " | ";
         }
         */
        // La parte superior del contenido
        contenido += "<h3 align=right> " + alumno.getScarrera() + " </h3> "
                + "<p align=right> <i>"
                + alumno.getSgrado() + "</i><br><b>"
                + alumno.getsNombre() + " " + alumno.getsApellidoPaterno() + " "
                + alumno.getsApellidoMaterno() + "</b>"
                + "<br>"
                + "<b>Nacido en: </b>" + alumno.getdFechaNacimiento().toString() + "<br>"
                + "<b>Contacto:</b> " + correos_str + "<br>"
                + direcciones_str
                + telefonos_str
                + " </p> <hr>";

        // La parte inferior del contenido

        contenido += "<p align=left>"
                + "<b>Última actualización: </b>" + cv.getdFechaActualizacion()
                + " | <b>Historia en la Facultad de Ciencias:</b> " + cv.getsCreditos() + " ";

        contenido += (cv.getdFechaFinalCarrera() != null) ? ("| <b>Fecha de fin de carrera:</b>" + cv.getdFechaFinalCarrera().toString()) : "";
        contenido += ""
                + "<br><hr width=50% align=left>"
                + "<b>Objetivo: </b>" + cv.getsObjetivo()
                + "<br><br>"
                + "<b>Areas de interes:</b> " + cv.getsAreasInteres()
                + "<hr width=50% align=left>";

        contenido += "<b>Formación Academica y Profesional</b>:<br><br>"
                + formacion_str;

        contenido += "<hr width=25% align=left>";

        contenido += "<b>Experiencia Profesional</b>:<br><br>"
                + experienciaProfesional_str;

        contenido += "<hr width=25% align=left>";

        contenido += "<b>Habilidades y Conocimientos técnico profesionales</b>:<br><br>"
                + habilidades;

        contenido += "<hr width=25% align=left>";

        contenido += "<b>Artículos de investigación y/o trabajos publicados</b>:<br><br>"
                + investigacion_str;

        contenido += "<hr width=25% align=left>";

        contenido += "<b>Idiomas</b>:<br><br>"
                + idiomas_str
                + "<br>";

        contenido += "<hr width=25% align=left>";
        //contenido += "Contrato por: " + contratacion_str;
        contenido += "<br><b>Dispuesto a Viajar: </b> ";
        contenido += cv.isbDispuestoAViajar() ? "Sí" : "No";
        contenido += "<br><b>Dispuesto a Reubicarse: </b> ";
        contenido += cv.isbDispuestoAReubicarse() ? "Sí" : "No";
        contenido += "</p>";


        contenido += "</body></html>";
        //writeFile("cv.html",contenido,false);
        return contenido;
    }

    /**
     * Metodo para escritura de un archivo y probar la correcta salida del texto
     * html
     *
     * @param archivo archivo que se va a escribir
     * @param contenido la cadena que quedaran en el archivo
     * @param append el bit que dirá si se anexa el contenido o se empieza de
     * cero
     */
    private void writeFile(String archivo, String contenido, boolean append) {
        FileWriter file = null;
        try {
            file = new FileWriter(archivo, append);
            file.write(contenido);
        } //writeFile
        catch (IOException ex) {
            Logger.getLogger(HTMLCVGenerator.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                file.close();
            } catch (IOException ex) {
                Logger.getLogger(HTMLCVGenerator.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }//writeFile

    /**
     * Pruebas con la base de datos y un achivo generado
     *
     * @param args
     * @throws appException
     * @throws ConexionException
     */
    public static void main(String args[]) throws appException, ConexionException {



        AlumnoE a = new AlumnoE(2);

        HTMLCVGenerator htmlcvg = new HTMLCVGenerator(a);

        System.out.println(htmlcvg);

        htmlcvg.generarCV();


    }
}